﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace NetFrame.EnDecode {
    /// <summary>
    /// 基本的编码解码类，可以扩展此类以添加更多的编码解码过程
    /// </summary>
    public class BaseCode {
        /// <summary>
        /// 基本编码方法（长度以及传输模型编码）
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public byte[] Encoding(TransModel obj) {
            

            byte[] value = SeProbuf.Se(obj);

            //编码失败，序列化出错
            if (value == null) {
                return null;
            }

            //调用子类的编码方法（加密、压缩等）
            byte[] value2 = OtherEncode(value);

            //编码失败，子类编码出错
            if (value2 == null) {
                return null;
            }

            //最后，进行长度编码
            return EnDecodeFun.LengthEncoding(value2);
        }

        /// <summary>
        /// 基本解码方法（长度以及传输模型解码）
        /// </summary>
        /// <param name="cache"></param>
        /// <returns></returns>
        public TransModel Decoding(ref List<byte> cache) {

            //长度解码
            byte[] value = EnDecodeFun.LengthDecoding(ref cache);

            //解码失败(长度不够)
            if (value == null) {
                return null;
            }

            //否则，调用子类的解码方法(加密、压缩等)
            byte[] value2 = OtherDecode(value);

            //解码失败(子类解码出错)
            if (value2 == null) {
                return null;
            }

            return SeProbuf.De<TransModel>(value2);
        }

        protected virtual byte[] OtherEncode(byte[] value) {
            //nothing to do
            return value;
        }

        protected virtual byte[] OtherDecode(byte[] value) {
            //nothing to do
            return value;
        }
    }
}
